package cn.tedu.justone.pack02;

/**
 * @作者：JustOne
 * @时间：2021/8/22 - 10:58
 */
public class Demo15_方法示例_interrupt对阻塞线程的影响 {
    public static void main(String[] args) {

        //方法示例：interrupt()中断一个线程的阻塞(对阻塞的线程有效)
        //方法示例：interrupt()中断一个线程的阻塞(对阻塞的线程有效)
        //方法示例：interrupt()中断一个线程的阻塞(对阻塞的线程有效)

        //相关方法：
        // 1, t.interrupt();中断t线程的阻塞
        // 2, t.isInterrupted(); 获取t线程是否有被求标记中断
        // 3, t.interrupted(); 获取执行该代码的线程是否有被求标记中断，并清除标记，与t无关

        //结论：
        //1,t.interrupt对非阻塞线程没有效，只是该变了t的中断标记，
        //  即t.isInterrupted()从false变成了true。
        //2,t.interrupt对t1.sleep(), t1.join(), lock.wait()阻塞有效，且会抛出异常。
        //3,刘景景特别备注：中断标记随时都可以做，与该线程是否运行到了锁中，没有任何关系。
        //  因为锁是的蛋糕，不是吃蛋糕的人。
        final String lock = "刘景景";


        //创建you线程，在家睡觉
        Thread you = new Thread(){
            @Override
            public void run() {
                /*
                //测试一：t.interrupt对非阻塞线程没有效，只是该变了t的中断标记
                for (int i = 0; i < 500000 * 30; i++) {
                    if(i%500000==0){
                        System.out.println("You：努力搬砖中");
                    }
                }
                */

                /*
                //测试二：
                // 1,t.interrupt对t1.sleep()阻塞有效。
                // 2,t1.sleep()被打断后会抛出InterruptedException: sleep interrupted异常
                // 3,t1.sleep()被打断后的代码不会运行(异常之后的代码都不会运行)
                System.out.println("You：忙了一天，睡觉个美容觉");
                try {
                    Thread.sleep(8*1000);
                    System.out.println("You：我是睡醒了才来上班的");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    System.out.println("You：我是睡到一半被迫来上班的");
                }
                System.out.println("You：努力搬砖中");
                */

                /*
                //测试三：
                // 1,t.interrupt对lock.wait()阻塞有效
                // 2,lock.wait()被打断后会抛出InterruptedException异常
                // 3,3,t1.sleep()被打断后的代码不会运行(异常之后的代码都不会运行)
                synchronized (lock){
                    System.out.println("You：忙了一天，睡觉个美容觉");
                    try {
                        lock.wait(8*1000);
                        System.out.println("You：我是睡醒了才来上班的");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        System.out.println("You：我是睡到一半被迫来上班的");
                    }
                    System.out.println("You：努力搬砖中");
                }
                */

                //测试四:
                // 为了代码优雅，我删除了测试t1.join()的案例，
                // 亲测效果与sleep()效果一致
            }
        };

        //创建boss线程，喊你提前上班
        Thread boss = new Thread(){
            @Override
            public void run() {
                System.out.println("Boss：服务器崩了，喊小王过来加班");
                for (int i = 0; i < 3; i++) {
                    System.out.println("Boss: call 小王");
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //boss没有中断你的休息
                System.out.println("...");

                //获取you线程是否被标记了中断:false
                System.out.println("---You线程是否被标记中断：" + you.isInterrupted());

                //boss决定中断你的休息
                System.out.println("Boss：踹门，起来加班，补贴500块");
                you.interrupt();//中断you线程，如果you是阻塞状态就会出现异常，非阻塞状态就不会异常

                //获取you线程是否被标记了中断:true
                System.out.println("---You线程是否被标记中断：" + you.isInterrupted());
            }
        };

        you.start();
        boss.start();

    }
}
